import pyautogui
import time
import xlrd
import pyperclip

#定义鼠标事件

#pyautogui库其他用法 https://blog.csdn.net/qingfengxd1/article/details/108270159
def mouseClick(clickTimes,lOrR,img,reTry):
    if reTry == 1:
        while True:
            location=pyautogui.locateCenterOnScreen(img,confidence=0.9)
            if location is not None:
                pyautogui.click(location.x,location.y,clicks=clickTimes,interval=0.2,duration=0.2,button=lOrR)
                break
            print("未找到匹配图片,0.1秒后重试")
            time.sleep(0.1)
    elif reTry == -1:
        while True:
            location=pyautogui.locateCenterOnScreen(img,confidence=0.9)
            if location is not None:
                pyautogui.click(location.x,location.y,clicks=clickTimes,interval=0.2,duration=0.2,button=lOrR)
            time.sleep(0.1)
    elif reTry > 1:
        i = 1
        while i < reTry + 1:
            location=pyautogui.locateCenterOnScreen(img,confidence=0.9)
            if location is not None:
                pyautogui.click(location.x,location.y,clicks=clickTimes,interval=0.2,duration=0.2,button=lOrR)
                print("重复")
                i += 1
            time.sleep(0.1)




# 数据检查
# cmdType.value  1.0 左键单击  2.0 左键双击  3.0 右键单击  4.0 输入  5.0 等待  6.0 滚轮
# ctype     空：0
#           字符串：1
#           数字：2
#           日期：3
#           布尔：4
#           error：5
def dataCheck(sheet1):
    checkCmd = True
    #行数检查
    if sheet1.nrows<2:
        print("没数据啊哥")
        checkCmd = False
    #每行数据检查
    i = 1
    while i < sheet1.nrows:
        # 第1列 操作类型检查
        #ctype ♦ 0. empty（空的）,1 string（text）, 2 number, 3 date, 4 boolean, 5 error， 6 blank（空白表格）
        cmdType = sheet1.row(i)[0]
        if cmdType.ctype != 2 or (cmdType.value != 1.0 and cmdType.value != 2.0 and cmdType.value != 3.0
        and cmdType.value != 4.0 and cmdType.value != 5.0 and cmdType.value != 6.0 and cmdType.value != 7.0
        and cmdType.value != 8.0 and cmdType.value != 9.0):
            print('第',i+1,"行,第1列数据有毛病")
            checkCmd = False
        # 第2列 内容检查
        cmdValue = sheet1.row(i)[1]
        # 读图点击类型指令，内容必须为字符串类型
        if cmdType.value ==1.0 or cmdType.value == 2.0 or cmdType.value == 3.0:
            if cmdValue.ctype != 1:
                print('第',i+1,"行,第2列数据有毛病")
                checkCmd = False
        # 输入类型，内容不能为空
        if cmdType.value == 4.0:
            if cmdValue.ctype == 0:
                print('第',i+1,"行,第2列数据有毛病")
                checkCmd = False
        # 等待类型，内容必须为数字
        if cmdType.value == 5.0:
            if cmdValue.ctype != 2:
                print('第',i+1,"行,第2列数据有毛病")
                checkCmd = False
        # 滚轮事件，内容必须为数字
        if cmdType.value == 6.0:
            if cmdValue.ctype != 2:
                print('第',i+1,"行,第2列数据有毛病")
                checkCmd = False
        # 滚轮(自定义)事件
        #if cmdType.value == 7.0:
            #if cmdValue.ctype != 2:
                #print('第',i+1,"行,第2列数据有毛病")
                #checkCmd = False
        #鼠标移动点击
        if cmdType.value == 8.0:
            if cmdValue.ctype != 1:
                print('第',i+1,"行,第2列数据有毛病")
                checkCmd = False
        #自定义模块方法
        if cmdType.value == 9.0:
            if cmdValue.ctype != 1:
                print('第',i+1,"行,第2列数据有毛病")
                checkCmd = False
        i += 1
    return checkCmd

#任务
def mainWork(img,frequency=None):
    #转换time为整型
    if frequency is not None:
      frequency = int(frequency)

    #循环读取sheet内容
    i = 1
    while i < sheet1.nrows:
        #取本行指令的操作类型
        cmdType = sheet1.row(i)[0]
        if cmdType.value == 1.0:
            #取值
            img = sheet1.row(i)[1].value
            reTry = 1
            if sheet1.row(i)[2].ctype == 2 and sheet1.row(i)[2].value != 0:
                reTry = sheet1.row(i)[2].value
            mouseClick(1,"left",img,reTry)
            print("单击左键",img)
        #2代表双击左键
        elif cmdType.value == 2.0:
            #取值
            img = sheet1.row(i)[1].value
            #取重试次数
            reTry = 1
            if sheet1.row(i)[2].ctype == 2 and sheet1.row(i)[2].value != 0:
                reTry = sheet1.row(i)[2].value
            mouseClick(2,"left",img,reTry)
            print("双击左键",img)
        #3代表右键
        elif cmdType.value == 3.0:
            #取值
            img = sheet1.row(i)[1].value
            #取重试次数
            reTry = 1
            if sheet1.row(i)[2].ctype == 2 and sheet1.row(i)[2].value != 0:
                reTry = sheet1.row(i)[2].value
            mouseClick(1,"right",img,reTry)
            print("右键",img)
        #4代表输入
        elif cmdType.value == 4.0:
            inputValue = sheet1.row(i)[1].value
            pyperclip.copy(inputValue)
            pyautogui.hotkey('ctrl','v')
            time.sleep(0.5)
            print("输入:",inputValue)
        #5代表等待
        elif cmdType.value == 5.0:
            #取值
            waitTime = sheet1.row(i)[1].value
            time.sleep(waitTime)
            print("等待",waitTime,"秒")
        #6代表滚轮
        elif cmdType.value == 6.0:
            #取值
            scroll = sheet1.row(i)[1].value
            pyautogui.scroll(int(scroll))
            print("滚轮滑动",int(scroll),"距离")
        #7代表滚轮(自定义)
        elif cmdType.value == 7.0:
            #取值
            scroll = sheet1.row(i)[1].value
            result = scroll.find(',')
            if result == -1:
              #判断是都数字类型
              pyautogui.scroll(int(scroll))
              print("滚轮滑动", int(scroll), "距离")
            else:
              #把参数拆解成列表[,,,]
              scroll = scroll.split(',')
              #如果没有模块参数
              if len(scroll) != 4:
                pyautogui.moveTo(int(scroll[1]), int(scroll[2]))
                pyautogui.click()
                pyautogui.scroll(int(scroll[0]))
              else:
                #获取模块名字
                moduleName = scroll[3]
                #导入模块并执行方法, 注意一个模块只会被导入一次，不管你执行了多少次import。
                module = __import__(moduleName)
                module.runScroll(frequency+1,scroll)
        #8代表移动点击
        elif cmdType.value == 8.0:
            #取图片名称
            scroll = sheet1.row(i)[1].value
            scroll = scroll.split(',')
            if len(scroll) != 3:
              pyautogui.moveTo(int(scroll[0]),int(scroll[1]),0.5)
              pyautogui.click()
              print("鼠标移动 x ",int(scroll[0])," y ",int(scroll[1]))
            else:
              # 获取模块名字
              moduleName = scroll[2]
              # 导入模块并执行方法, 注意一个模块只会被导入一次，不管你执行了多少次import。
              module = __import__(moduleName)
              module.runMove(frequency + 1, scroll)
        #9自定义模块事件 模块名,方法名
        elif cmdType.value == 9.0:
            #取图片名称
            content = sheet1.row(i)[1].value
            content = content.split(',')
            # 获取模块名字
            moduleName = content[0]
            methodName = content[1]
            # 导入模块并执行方法, 注意一个模块只会被导入一次，不管你执行了多少次import。
            module = __import__(moduleName)
            getattr(module, methodName)()
        i += 1

if __name__ == '__main__':
    file = 'cmd.xls'
    #打开文件
    wb = xlrd.open_workbook(filename=file)
    #通过索引获取表格sheet页
    sheet1 = wb.sheet_by_index(0)
    print('欢迎使用不高兴就喝水牌RPA~')
    #数据检查
    checkCmd = dataCheck(sheet1)
    if checkCmd:
        key = input('选择功能: 1.做一次 2.循环到死  其它数字即为要做的次数 \n')
        if key == '1':
            #循环拿出每一行指令
            time.sleep(0.1)
            print("等待0.1秒")
            mainWork(sheet1,key)
        elif key == '0':
            while True:
                time.sleep(0.1)
                print("等待0.1秒")
                mainWork(sheet1)
        elif key != '1' or key != '0':
          for num in range(0, int(key)):
            time.sleep(1)
            print("等待1秒")
            mainWork(sheet1,num)
    else:
        print('输入有误或者已经退出!')
